﻿using System.Web;
using System.Text;
using System.IO;
using System.Net;
using System;
using System.Collections.Generic;

namespace WebSite.Code.AlipayClass
{
    /// <summary>
    /// 类名：alipay_service
    /// 功能：支付宝外部服务接口控制
    /// 详细：该页面是请求参数核心处理文件，不需要修改
    /// 版本：3.1
    /// 修改日期：2010-10-29
    /// 说明：
    /// 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
    /// 该代码仅供学习和研究支付宝接口使用，只是提供一个参考
    /// </summary>
    public class AlipayService
    {
        private string gateway = "";                //网关地址
        private string _key = "";                   //交易安全校验码
        private string _input_charset = "";         //编码格式
        private string _sign_type = "";             //签名方式
        private string mysign = "";                 //签名结果
        private Dictionary<string, string> sPara = new Dictionary<string, string>();//要签名的字符串

        /// <summary>
        /// 构造函数
        /// 从配置文件及入口文件中初始化变量
        /// </summary>
        /// <param name="partner">合作身份者ID</param>
        /// <param name="seller_email">签约支付宝账号或卖家支付宝帐户</param>
        /// <param name="return_url">付完款后跳转的页面 要用 以http开头格式的完整路径，不允许加?id=123这类自定义参数</param>
        /// <param name="notify_url">交易过程中服务器通知的页面 要用 以http开格式的完整路径，不允许加?id=123这类自定义参数</param>
        /// <param name="show_url">网站商品的展示地址，不允许加?id=123这类自定义参数</param>
        /// <param name="out_trade_no">请与贵网站订单系统中的唯一订单号匹配</param>
        /// <param name="subject">订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。</param>
        /// <param name="body">订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里</param>
        /// <param name="total_fee">订单总金额，显示在支付宝收银台里的“应付总额”里</param>
        /// <param name="paymethod">默认支付方式，四个值可选：bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付)</param>
        /// <param name="defaultbank">默认网银代号，代号列表见club.alipay.com/read.php?tid=8681379</param>
        /// <param name="anti_phishing_key">防钓鱼时间戳</param>
        /// <param name="exter_invoke_ip">买家本地电脑的IP地址</param>
        /// <param name="extra_common_param">自定义参数，可存放任何内容（除等特殊字符外），不会显示在页面上</param>
        /// <param name="buyer_email">默认买家支付宝账号</param>
        /// <param name="royalty_type">提成类型，该值为固定值：10，不需要修改</param>
        /// <param name="royalty_parameters">提成信息集，与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条</param>
        /// <param name="key">安全检验码</param>
        /// <param name="input_charset">字符编码格式 目前支持 gbk 或 utf-8</param>
        /// <param name="sign_type">签名方式 不需修改</param>
        public AlipayService(string partner,
            string seller_email,
            string return_url,
            string notify_url,
            string show_url,
            string out_trade_no,
            string subject,
            string body,
            string total_fee,
            string paymethod,
            string defaultbank,
            string anti_phishing_key,
            string exter_invoke_ip,
            string extra_common_param,
            string buyer_email,
            string royalty_type,
            string royalty_parameters,
            string key,
            string input_charset,
            string sign_type,

            string totalprice,
           string totalscore,
           string chk1,
           string carid,
           string cname,
           string tel,
           string phone,
           string post,
           string address,
           string email,
           string content,
           string cname1,
           string tel1,
           string phone1,
           string post1,
           string address1,
           string email1,
           string content1,
           string pay,
            string paymoney,
            string ordercode)
        {
            gateway = "https://www.alipay.com/cooperate/gateway.do?";
            _key = key.Trim();
            _input_charset = input_charset.ToLower();
            _sign_type = sign_type.ToUpper();
            SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();

            //构造签名参数数组
            sParaTemp.Add("service", "create_direct_pay_by_user");
            sParaTemp.Add("payment_type", "1");
            sParaTemp.Add("partner" , partner);
            sParaTemp.Add("seller_email" , seller_email);
            sParaTemp.Add("return_url" , return_url);
            sParaTemp.Add("notify_url" , notify_url);
            sParaTemp.Add("_input_charset" , _input_charset);
            sParaTemp.Add("show_url" , show_url);
            sParaTemp.Add("out_trade_no" , out_trade_no);
            sParaTemp.Add("subject" , subject);
            sParaTemp.Add("body" , body);
            sParaTemp.Add("total_fee" , total_fee);
            sParaTemp.Add("paymethod" , paymethod);
            sParaTemp.Add("defaultbank" , defaultbank);
            sParaTemp.Add("anti_phishing_key", anti_phishing_key);
            sParaTemp.Add("exter_invoke_ip" , exter_invoke_ip);
            sParaTemp.Add("extra_common_param" , extra_common_param);
            sParaTemp.Add("buyer_email" , buyer_email);
            sParaTemp.Add("royalty_type" , royalty_type);
            sParaTemp.Add("royalty_parameters" , royalty_parameters);
            //--自定义，添加
            sParaTemp.Add("totalprice=" , totalprice);
            sParaTemp.Add("totalscore=" , totalscore);
            sParaTemp.Add("chk1=" , chk1);
            sParaTemp.Add("carid=" , carid);
            sParaTemp.Add("cname=" , cname);
            sParaTemp.Add("tel=" , tel);
            sParaTemp.Add("phone=" , phone);
            sParaTemp.Add("post=" , post);
            sParaTemp.Add("address=" , address);
            sParaTemp.Add("email=" , email);
            sParaTemp.Add("content=" , content);
            sParaTemp.Add("cname1=" , cname1);
            sParaTemp.Add("tel1=" , tel1);
            sParaTemp.Add("phone1=" , phone1);
            sParaTemp.Add("post1=" , post1);
            sParaTemp.Add("address1=" , address1);
            sParaTemp.Add("email1=" , email1);
            sParaTemp.Add("content1=" , content1);
            sParaTemp.Add("pay=", pay);
            sParaTemp.Add("paymoney=", paymoney);
            sParaTemp.Add("ordercode=", ordercode);

            sPara = AlipayFunction.Para_filter(sParaTemp);
            //获得签名结果
            mysign = AlipayFunction.Build_mysign(sPara, _key, _sign_type, _input_charset);
        }

        /// <summary>
        /// 构造表单提交HTML
        /// </summary>
        /// <returns>输出 表单提交HTML文本</returns>
        public string Build_Form()
        {
            StringBuilder sbHtml = new StringBuilder();

            //GET方式传递
            sbHtml.Append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + _input_charset + "\" method=\"get\">");

            //POST方式传递（GET与POST二必选一）
            //sbHtml.Append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + _input_charset + "\" method=\"post\">");

            foreach (KeyValuePair<string, string> temp in sPara)
            {
                sbHtml.Append("<input type=\"hidden\" name=\"" + temp.Key + "\" value=\"" + temp.Value + "\"/>");
            }

            sbHtml.Append("<input type=\"hidden\" name=\"sign\" value=\"" + mysign + "\"/>");
            sbHtml.Append("<input type=\"hidden\" name=\"sign_type\" value=\"" + _sign_type + "\"/>");

            //submit按钮控件请不要含有name属性
            sbHtml.Append("<input type=\"submit\" value=\"支付宝确认付款\"></form>");

            sbHtml.Append("<script>document.forms['alipaysubmit'].submit();</script>");

            return sbHtml.ToString();
        }
    }
}